Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


nomadnet/ui/textui/Guide.py a83db96b225a1ff2d3e57f6a61805c2b9b21f39d (a83db96b) Text, 43.57 KB

Tff7b72import T7ee787RNS
Tff7b72import T7ee787urwid
Tff7b72import T7ee787nomadnet
Tff7b72from T7ee787nomadnetT7ee787.T7ee787vendorT7ee787.T7ee787additional_urwid_widgets Tff7b72import Te6edf3IndicativeListBoxTb4b4b4, Te6edf3MODIFIER_KEY
Tff7b72from T7ee787.T7ee787MicronParser Tff7b72import Te6edf3markup_to_attrmaps
Tff7b72from T7ee787nomadnetT7ee787.T7ee787vendorT7ee787.T7ee787Scrollable Tff7b72import Tff7b72*

Tff7b72class T56d364GuideDisplayShortcutsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3appTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffapp Tff7b72= Te6edf3app
Te6edf3g Tff7b72= Te6edf3appTff7b72.Td2a8ffuiTff7b72.Td2a8ffglyphs

Tff7b72selfTff7b72.Td2a8ffwidget Tff7b72= Te6edf3urwidTff7b72.Td2a8ffAttrMapTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffPaddingTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffTextTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3alignTff7b72=Ta5d6ff"Ta5d6ffleftTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffshortcutbarTa5d6ff"Tb4b4b4)

Tff7b72class T56d364ListEntryTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffTextTb4b4b4)Tb4b4b4:
Te6edf3_selectable Tff7b72= Tff7b72True

Te6edf3signals Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffclickTa5d6ff"Tb4b4b4]

Tff7b72def Td2a8ffkeypressTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sizeTb4b4b4, Te6edf3keyTb4b4b4)Tb4b4b4:
T8b949e"""
Send 'click' signal on 'activate' command.
"""
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_command_mapTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72!= Te6edf3urwidTff7b72.Td2a8ffACTIVATETb4b4b4:
Tff7b72return Te6edf3key

Tff7b72selfTff7b72.Td2a8ff_emitTb4b4b4(Ta5d6ff'Ta5d6ffclickTa5d6ff'Tb4b4b4)

Tff7b72def Td2a8ffmouse_eventTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sizeTb4b4b4, Te6edf3eventTb4b4b4, Te6edf3buttonTb4b4b4, Te6edf3xTb4b4b4, Te6edf3yTb4b4b4, Te6edf3focusTb4b4b4)Tb4b4b4:
T8b949e"""
Send 'click' signal on button 1 press.
"""
Tff7b72if Te6edf3button Tff7b72!= T79c0ff1 Tff7b72or Tff7b72not Te6edf3urwidTff7b72.Td2a8ffutilTff7b72.Td2a8ffis_mouse_pressTb4b4b4(Te6edf3eventTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False

Tff7b72selfTff7b72.Td2a8ff_emitTb4b4b4(Ta5d6ff'Ta5d6ffclickTa5d6ff'Tb4b4b4)
Tff7b72return Tff7b72True

Tff7b72class T56d364SelectTextTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffTextTb4b4b4)Tb4b4b4:
Te6edf3_selectable Tff7b72= Tff7b72True

Te6edf3signals Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffclickTa5d6ff"Tb4b4b4]

Tff7b72def Td2a8ffkeypressTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sizeTb4b4b4, Te6edf3keyTb4b4b4)Tb4b4b4:
T8b949e"""
Send 'click' signal on 'activate' command.
"""
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_command_mapTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72!= Te6edf3urwidTff7b72.Td2a8ffACTIVATETb4b4b4:
Tff7b72return Te6edf3key

Tff7b72selfTff7b72.Td2a8ff_emitTb4b4b4(Ta5d6ff'Ta5d6ffclickTa5d6ff'Tb4b4b4)

Tff7b72def Td2a8ffmouse_eventTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sizeTb4b4b4, Te6edf3eventTb4b4b4, Te6edf3buttonTb4b4b4, Te6edf3xTb4b4b4, Te6edf3yTb4b4b4, Te6edf3focusTb4b4b4)Tb4b4b4:
T8b949e"""
Send 'click' signal on button 1 press.
"""
Tff7b72if Te6edf3button Tff7b72!= T79c0ff1 Tff7b72or Tff7b72not Te6edf3urwidTff7b72.Td2a8ffutilTff7b72.Td2a8ffis_mouse_pressTb4b4b4(Te6edf3eventTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False

Tff7b72selfTff7b72.Td2a8ff_emitTb4b4b4(Ta5d6ff'Ta5d6ffclickTa5d6ff'Tb4b4b4)
Tff7b72return Tff7b72True

Tff7b72class T56d364GuideEntryTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffWidgetWrapTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3appTb4b4b4, Te6edf3parentTb4b4b4, Te6edf3readerTb4b4b4, Te6edf3topic_nameTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffapp Tff7b72= Te6edf3app
Tff7b72selfTff7b72.Td2a8ffparent Tff7b72= Te6edf3parent
Tff7b72selfTff7b72.Td2a8ffreader Tff7b72= Te6edf3reader
Tff7b72selfTff7b72.Td2a8fflast_keypress Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fftopic_name Tff7b72= Te6edf3topic_name
Te6edf3g Tff7b72= Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffuiTff7b72.Td2a8ffglyphs

Te6edf3widget Tff7b72= Te6edf3ListEntryTb4b4b4(Te6edf3topic_nameTb4b4b4)
Te6edf3urwidTff7b72.Td2a8ffconnect_signalTb4b4b4(Te6edf3widgetTb4b4b4, Ta5d6ff"Ta5d6ffclickTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffdisplay_topicTb4b4b4, Tff7b72selfTff7b72.Td2a8fftopic_nameTb4b4b4)

Te6edf3style Tff7b72= Ta5d6ff"Ta5d6fftopic_list_normalTa5d6ff"
Te6edf3focus_style Tff7b72= Ta5d6ff"Ta5d6fflist_focusTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffdisplay_widget Tff7b72= Te6edf3urwidTff7b72.Td2a8ffAttrMapTb4b4b4(Te6edf3widgetTb4b4b4, Te6edf3styleTb4b4b4, Te6edf3focus_styleTb4b4b4)
Te6edf3urwidTff7b72.Td2a8ffWidgetWrapTff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdisplay_widgetTb4b4b4)

Tff7b72def Td2a8ffdisplay_topicTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3eventTb4b4b4, Te6edf3topicTb4b4b4)Tb4b4b4:
Te6edf3markup Tff7b72= Te6edf3TOPICSTb4b4b4[Te6edf3topicTb4b4b4]
Te6edf3attrmaps Tff7b72= Te6edf3markup_to_attrmapsTb4b4b4(Te6edf3markupTb4b4b4, Te6edf3url_delegateTff7b72=Tff7b72NoneTb4b4b4)

Te6edf3topic_position Tff7b72= Tff7b72None
Te6edf3index Tff7b72= T79c0ff0
Tff7b72for Te6edf3topic Tff7b72in Tff7b72selfTff7b72.Td2a8ffparentTff7b72.Td2a8fftopic_listTb4b4b4:
Te6edf3widget Tff7b72= Te6edf3topicTff7b72.Td2a8ff_original_widget
Tff7b72if Te6edf3widgetTff7b72.Td2a8fftopic_name Tff7b72== Tff7b72selfTff7b72.Td2a8fftopic_nameTb4b4b4:
Te6edf3topic_position Tff7b72= Te6edf3index
Te6edf3index Tff7b72+Tff7b72= T79c0ff1

Tff7b72if Te6edf3topic_position Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffparentTff7b72.Td2a8ffilbTff7b72.Td2a8ffselect_itemTb4b4b4(Te6edf3topic_positionTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffreaderTff7b72.Td2a8ffset_content_widgetsTb4b4b4(Te6edf3attrmapsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffreaderTff7b72.Td2a8fffocus_readerTb4b4b4(Tb4b4b4)


Tff7b72def Td2a8ffmicron_released_focusTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreaderTff7b72.Td2a8fffocus_topicsTb4b4b4(Tb4b4b4)

Tff7b72class T56d364TopicListTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffWidgetWrapTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3appTb4b4b4, Te6edf3guide_displayTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffapp Tff7b72= Te6edf3app
Te6edf3g Tff7b72= Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffuiTff7b72.Td2a8ffglyphs

Tff7b72selfTff7b72.Td2a8fffirst_run_entry Tff7b72= Te6edf3GuideEntryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Tff7b72selfTb4b4b4, Te6edf3guide_displayTb4b4b4, Ta5d6ff"Ta5d6ffFirst RunTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8fftopic_list Tff7b72= Tb4b4b4[
Te6edf3GuideEntryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Tff7b72selfTb4b4b4, Te6edf3guide_displayTb4b4b4, Ta5d6ff"Ta5d6ffIntroductionTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3GuideEntryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Tff7b72selfTb4b4b4, Te6edf3guide_displayTb4b4b4, Ta5d6ff"Ta5d6ffConcepts & TerminologyTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3GuideEntryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Tff7b72selfTb4b4b4, Te6edf3guide_displayTb4b4b4, Ta5d6ff"Ta5d6ffHosting a NodeTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3GuideEntryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Tff7b72selfTb4b4b4, Te6edf3guide_displayTb4b4b4, Ta5d6ff"Ta5d6ffConfiguration OptionsTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3GuideEntryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Tff7b72selfTb4b4b4, Te6edf3guide_displayTb4b4b4, Ta5d6ff"Ta5d6ffKeyboard ShortcutsTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3GuideEntryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Tff7b72selfTb4b4b4, Te6edf3guide_displayTb4b4b4, Ta5d6ff"Ta5d6ffMarkupTa5d6ff"Tb4b4b4)Tb4b4b4,
Tff7b72selfTff7b72.Td2a8fffirst_run_entryTb4b4b4,
Te6edf3GuideEntryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Tff7b72selfTb4b4b4, Te6edf3guide_displayTb4b4b4, Ta5d6ff"Ta5d6ffNetwork ConfigurationTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3GuideEntryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Tff7b72selfTb4b4b4, Te6edf3guide_displayTb4b4b4, Ta5d6ff"Ta5d6ffDisplay TestTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3GuideEntryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Tff7b72selfTb4b4b4, Te6edf3guide_displayTb4b4b4, Ta5d6ff"Ta5d6ffCredits & LicensesTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4]

Tff7b72selfTff7b72.Td2a8ffilb Tff7b72= Te6edf3IndicativeListBoxTb4b4b4(
Tff7b72selfTff7b72.Td2a8fftopic_listTb4b4b4,
Te6edf3initialization_is_selection_changeTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3highlight_offFocusTff7b72=Ta5d6ff"Ta5d6fflist_off_focusTa5d6ff"
Tb4b4b4)

Te6edf3urwidTff7b72.Td2a8ffWidgetWrapTff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3urwidTff7b72.Td2a8ffLineBoxTb4b4b4(Tff7b72selfTff7b72.Td2a8ffilbTb4b4b4, Te6edf3titleTff7b72=Ta5d6ff"Ta5d6ffTopicsTa5d6ff"Tb4b4b4)Tb4b4b4)


Tff7b72def Td2a8ffkeypressTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sizeTb4b4b4, Te6edf3keyTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3key Tff7b72== Ta5d6ff"Ta5d6ffupTa5d6ff" Tff7b72and Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffilbTff7b72.Td2a8fffirst_item_is_selectedTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3nomadnetTff7b72.Td2a8ffNomadNetworkAppTff7b72.Td2a8ffget_shared_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffuiTff7b72.Td2a8ffmain_displayTff7b72.Td2a8ffframeTff7b72.Td2a8ffset_focusTb4b4b4(Ta5d6ff"Ta5d6ffheaderTa5d6ff"Tb4b4b4)
Tff7b72return Tffa657superTb4b4b4(Te6edf3TopicListTb4b4b4, Tff7b72selfTb4b4b4)Tff7b72.Td2a8ffkeypressTb4b4b4(Te6edf3sizeTb4b4b4, Te6edf3keyTb4b4b4)

Tff7b72class T56d364GuideDisplayTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3list_width Tff7b72= T79c0ff0.33

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3appTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffapp Tff7b72= Te6edf3app
Te6edf3g Tff7b72= Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffuiTff7b72.Td2a8ffglyphs

Te6edf3topic_text Tff7b72= Te6edf3urwidTff7b72.Td2a8ffTextTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff No topic selectedTa5d6ff"Tb4b4b4, Te6edf3alignTff7b72=Ta5d6ff"Ta5d6ffleftTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffleft_area Tff7b72= Te6edf3TopicListTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Tff7b72selfTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffright_area Tff7b72= Te6edf3urwidTff7b72.Td2a8ffLineBoxTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffFillerTb4b4b4(Te6edf3topic_textTb4b4b4, Ta5d6ff"Ta5d6fftopTa5d6ff"Tb4b4b4)Tb4b4b4)


Tff7b72selfTff7b72.Td2a8ffcolumns Tff7b72= Te6edf3urwidTff7b72.Td2a8ffColumnsTb4b4b4(
Tb4b4b4[
Tb4b4b4(Ta5d6ff"Ta5d6ffweightTa5d6ff"Tb4b4b4, Te6edf3GuideDisplayTff7b72.Td2a8fflist_widthTb4b4b4, Tff7b72selfTff7b72.Td2a8ffleft_areaTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffweightTa5d6ff"Tb4b4b4, T79c0ff1Tff7b72-Te6edf3GuideDisplayTff7b72.Td2a8fflist_widthTb4b4b4, Tff7b72selfTff7b72.Td2a8ffright_areaTb4b4b4)
Tb4b4b4]Tb4b4b4,
Te6edf3dividecharsTff7b72=T79c0ff0Tb4b4b4, Te6edf3focus_columnTff7b72=T79c0ff0
Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffshortcuts_display Tff7b72= Te6edf3GuideDisplayShortcutsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwidget Tff7b72= Tff7b72selfTff7b72.Td2a8ffcolumns

Tff7b72if Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8fffirstrunTb4b4b4:
Te6edf3entry Tff7b72= Tff7b72selfTff7b72.Td2a8ffleft_areaTff7b72.Td2a8fffirst_run_entry
Te6edf3entryTff7b72.Td2a8ffdisplay_topicTb4b4b4(Te6edf3entryTff7b72.Td2a8ffdisplay_topicTb4b4b4, Te6edf3entryTff7b72.Td2a8fftopic_nameTb4b4b4)

Tff7b72def Td2a8ffset_content_widgetsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3new_contentTb4b4b4)Tb4b4b4:
Te6edf3options Tff7b72= Tff7b72selfTff7b72.Td2a8ffcolumnsTff7b72.Td2a8ffoptionsTb4b4b4(Te6edf3width_typeTff7b72=Ta5d6ff"Ta5d6ffweightTa5d6ff"Tb4b4b4, Te6edf3width_amountTff7b72=T79c0ff1Tff7b72-Te6edf3GuideDisplayTff7b72.Td2a8fflist_widthTb4b4b4)
Te6edf3pile Tff7b72= Te6edf3urwidTff7b72.Td2a8ffPileTb4b4b4(Te6edf3new_contentTb4b4b4)
T8b949e#content = urwid.LineBox(urwid.Filler(pile, "top"))
Te6edf3content Tff7b72= Te6edf3urwidTff7b72.Td2a8ffLineBoxTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffAttrMapTb4b4b4(Te6edf3ScrollBarTb4b4b4(Te6edf3ScrollableTb4b4b4(Te6edf3pileTb4b4b4)Tb4b4b4, Te6edf3thumb_charTff7b72=Ta5d6ff"Tffea00\u2503Ta5d6ff"Tb4b4b4, Te6edf3trough_charTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffscrollbarTa5d6ff"Tb4b4b4)Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffcolumnsTff7b72.Td2a8ffcontentsTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= Tb4b4b4(Te6edf3contentTb4b4b4, Te6edf3optionsTb4b4b4)

Tff7b72def Td2a8ffshortcutsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffshortcuts_display

Tff7b72def Td2a8fffocus_topicsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcolumnsTff7b72.Td2a8fffocus_position Tff7b72= T79c0ff0

Tff7b72def Td2a8fffocus_readerTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcolumnsTff7b72.Td2a8fffocus_position Tff7b72= T79c0ff1


Te6edf3TOPIC_INTRODUCTION Tff7b72= Ta5d6ff'''Ta5d6ff>Nomad Network

Ta5d6ff`c`*Communicate Freely.`*
Ta5d6ff`a

Ta5d6ffThe intention with this program is to provide a tool to that allows you to build private and resilient communications platforms that are in complete control and ownership of the people that use them.

Ta5d6ffNomad Network is build on LXMF and Reticulum, which together provides the cryptographic mesh functionality and peer-to-peer message routing that Nomad Network relies on. This foundation also makes it possible to use the program over a very wide variety of communication mediums, from packet radio to fiber.

Ta5d6ffNomad Network does not need any connections to the public internet to work. In fact, it doesnTa5d6ff'Ta5d6fft even need an IP or Ethernet network. You can use it entirely over packet radio, LoRa or even serial lines. But if you wish, you can bridge islanded Reticulum networks over the Internet or private ethernet networks, or you can build networks running completely over the Internet. The choice is yours.

Ta5d6ffThe current version of the program should be considered a beta release. The program works well, but there will most probably be bugs and possibly sub-optimal performance in some scenarios. On the other hand, this is the best time to have an influence on the direction of the development of Nomad Network. To do so, join the discussion on the Nomad Network project on GitHub.

Ta5d6ff'''

Te6edf3TOPIC_SHORTCUTS Tff7b72= Ta5d6ff'''Ta5d6ff>Keyboard Shortcuts

Ta5d6ffThe different sections of the program has a number of keyboard shortcuts mapped, that makes operating and navigating the program easier. The following lists details all mapped shortcuts.

Ta5d6ff>>`!Conversations Window`!
Ta5d6ff>>>Conversation List
Ta5d6ff - Ctrl-N Start a new conversation
Ta5d6ff - Ctrl-E Display and edit selected peer info
Ta5d6ff - Ctrl-X Delete conversation
Ta5d6ff - Ctrl-R Open LXMF syncronisation dialog

Ta5d6ff>>>Conversation Display
Ta5d6ff - Ctrl-D Send message
Ta5d6ff - Ctrl-K Clear input fields
Ta5d6ff - Ctrl-T Toggle message title field
Ta5d6ff - Ctrl-O Toggle sort mode
Ta5d6ff - Ctrl-P Purge failed messages
Ta5d6ff - Ctrl-X Clear conversation history
Ta5d6ff - Ctrl-G Toggle fullscreen conversation
Ta5d6ff - Ctrl-W Close conversation

Ta5d6ff>>`!Network Window`!
Ta5d6ff>>>Announce Stream
Ta5d6ff - Ctrl-L Switch to Known Nodes list
Ta5d6ff - Ctrl-X Delete selected announce
Ta5d6ff - Ctrl-P Display peered LXMF Propagation Nodes

Ta5d6ff>>>Known Nodes
Ta5d6ff - Ctrl-L Switch to Announce Stream
Ta5d6ff - Ctrl-X Delete selected node entry
Ta5d6ff - Ctrl-P Display peered LXMF Propagation Nodes

Ta5d6ff>>>Browser
Ta5d6ff - Ctrl-D Back
Ta5d6ff - Ctrl-F Forward
Ta5d6ff - Ctrl-R Reload page
Ta5d6ff - Ctrl-U Open URL entry dialog
Ta5d6ff - Ctrl-S Save connected node
Ta5d6ff - Ctrl-G Toggle fullscreen browser window
Ta5d6ff - Ctrl-W Disconnect from node
Ta5d6ff'''

Te6edf3TOPIC_CONCEPTS Tff7b72= Ta5d6ff'''Ta5d6ff>Concepts and Terminology

Ta5d6ffThe following section will briefly introduce various concepts and terms used in the program.

Ta5d6ff>>Peer

Ta5d6ffA `*peer`* refers to another Nomad Network client, which will generally be operated by another person. But since Nomad Network is a general LXMF client, it could also be any other LXMF client, program, automated system or machine that can communicate over LXMF.

Ta5d6ffAll peers (and nodes) are identified by their `*address`* (which is, technically speaking, a Reticulum destination hash). An address consist of 32 hexadecimal characters (16 bytes), and looks like this:

Ta5d6ff`c<e9eafceea9e3664a5c55611c5e8c420a>
Ta5d6ff`l

Ta5d6ffAnyone can choose whatever display name they want, but addresses are always unique, and generated from the unique cryptographic keys of the peer. This is an important point to understand. Since there is not anyone controlling naming or address spaces in Nomad Network, you can easily come across another user with the same display name as you.

Ta5d6ffYour addresses will always be unique though, and you must always verify that the address you are communicating with is matching the address of the peer you expect to be in the other end.

Ta5d6ffTo make this easier, Nomad Network allows you to mark peers and nodes as either `*trusted`*, `*unknown`* or `*untrusted`*. In this way, you can mark the peers and nodes that you know to be legitimate, and easily spot peers with similar names as unrelated.

Ta5d6ff>>Announces

Ta5d6ffAn `*announce`* can be sent by any peer or node on the network, which will notify other peers of its existence, and contains the cryptographic keys that allows other peers to communicate with it.

Ta5d6ffIn the `![ Network ]`! section of the program, you can monitor announces on the network, initiate conversations with announced peers, and announce your own peer on the network. You can also connect to nodes on the network and browse information shared by them.

Ta5d6ff>>Conversations

Ta5d6ffNomad Network uses the term `*conversation`* to signify both direct peer-to-peer messaging threads, and also discussion threads with an arbitrary number of participants that might change over time.

Ta5d6ffBoth things like discussion forums and chat threads can be encapsulated as conversations in Nomad Network. The user interface will indicate the different characteristics a conversation can take, and also what form of transport encryption was used for messages within.

Ta5d6ffIn the `![ Conversations ]`! part of the program you can view and interact with all currently active conversations. You can also edit nickname and trust settings for peers belonging to these conversations here. To edit settings for a peer, select it in the conversation list, and press `!Ctrl-E`!.

Ta5d6ffBy default, Nomad Network will attempt to deliver messages to a peer directly. This happens by first establishing an encrypted link directly to the peer, and then delivering the message over it.

Ta5d6ffIf the desired peer is not available because it has disconnected from the network, this method will obviously fail. In this case, Nomad Network will attempt to deliver the message to a node, which will store and forward it over the network, for later retrieval by the destination peer. The message is encrypted with an ephemeral key before being transmitted to the network, and is only readable by the intended recipient.

Ta5d6ffFor propagated delivery to work, one or more nodes must be available on the network. If one or more trusted nodes are available, Nomad Network will automatically select the most suitable node to send the message via, but you can also manually specify what node to use.

Ta5d6ffTo select a node manually, go to the `![ Network ]`! part of the program, choose the desired node in the `*Known Nodes`* list, and select the `!< Info >`! button. In the `!Node Info`! dialog, you can specify the selected node as the default propagation node.

Ta5d6ffBy default, Nomad Network will check in with propagation nodes, and download any available messages every 6 hours. You can change this interval, or disable automatic syncronisation completely, by editing the configuration file.

Ta5d6ffYou can always initiate a sync manually, by pressing `!Ctrl-R`! in the `![ Conversations ]`! part of the program, which will open the syncronisation window.

Ta5d6ff>>Node

Ta5d6ffA Nomad Network `*node`* is an instance of the Nomad Network program that has been configured to host information for other peers and help propagate messages and information on the network.

Ta5d6ffNodes can host pages (similar to webpages) written in a markup-language called `*micron`*, as well as make files and other resources available for download for peers on the network. Nodes also form a distributed message store for offline users, and allows messages to be exchanged between peers that are not online at the same time.

Ta5d6ffIf no nodes exist on a network, all peers will still be able to communicate directly peer-to-peer, but both endpoints of a conversation will need to be available at the same time to converse. When nodes exist on the network, messages will be held and syncronised between nodes for deferred delivery if the destination peer is unavailable. Nodes will automatically discover and peer with each other, and handle syncronisation of message stores.

Ta5d6ffTo learn how to host your own node, read the `*Hosting a Node`* section of this guide.

Ta5d6ff'''

Te6edf3TOPIC_HOSTING Tff7b72= Ta5d6ff'''Ta5d6ff>Hosting a Node

Ta5d6ffTo host a node on the network, you must enable it in the configuration file, by setting `*enable_node`* directive to `*yes`*. You should also configure the other node-related parameters such as the node name and announce interval settings. Once node hosting has been enabled in the configuration, Nomad Network will start hosting your node as soon as the program is launched, and other peers on the network will be able to connect and interact with content on your node.

Ta5d6ffBy default, no content is defined, apart from a short placeholder home page. To learn how to add your own content, read on.

Ta5d6ff>>Distributed Message Store

Ta5d6ffAll nodes on the network automatically form a distributed message store that allows users to exchange messages, even when they are not available at the same time.

Ta5d6ffWhen Nomad Network is configured to host a node, it also configures itself as an LXMF Propagation Node, and automatically discovers and peers with other propagation nodes on the network. This process is completely automatic and requires no configuration from the node operator.

Ta5d6ffTo view LXMF Propagation nodes that are currently peered with your node, go to the `![ Network ]`! part of the program and press `!Ctrl-P`!.

Ta5d6ffThe distributed message store is resilient to intermittency, and will remain functional as long as at least one node remains on the network. Nodes that were offline for a time will automatically be synced up to date when they regain connectivity.

Ta5d6ff>>Pages

Ta5d6ffNomad Network nodes can host pages similar to web pages, that other peers can read and interact with. Pages are written in a compact markup language called `*micron`*. To learn how to write formatted pages with micron, see the `*Markup`* section of this guide (which is, itself, written in micron). Pages can be linked arbitrarily with hyperlinks, that can also link to pages (or other resources) on other nodes.

Ta5d6ffTo add pages to your node, place micron files in the `*pages`* directory of your Nomad Network programs `*storage`* directory. By default, the path to this will be `!~/.nomadnetwork/storage/pages`!. You should probably create the file `!index.mu`! first, as this is the page that will get served by default to a connecting peer.

Ta5d6ffYou can control how long a peer will cache your pages by including the cache header in a page. To do so, the first line of your page must start with `!#!c=X`!, where `!X`! is the cache time in seconds. To tell the peer to always load the page from your node, and never cache it, set the cache time to zero. You should only do this if there is a real need, for example if your page displays dynamic content that `*must`* be updated at every page view. The default caching time is 12 hours. In most cases, you should not need to include the cache control header in your pages.

Ta5d6ffYou can use a preprocessor such as PHP, bash, Python (or whatever you prefer) to generate dynamic pages. To do so, just set executable permissions on the relevant page file, and be sure to include the interpreter at the beginning of the file, for example `!#!/usr/bin/python3`!.

Ta5d6ff>>Authenticating Users

Ta5d6ffSometimes, you donTa5d6ff'Ta5d6fft want everyone to be able to view certain pages or execute certain scripts. In such cases, you can use `*authentication`* to control who gets to run certain requests.

Ta5d6ffTo enable authentication for any page, simply add a new file to your pages directory with Ta5d6ff"Ta5d6ff.allowedTa5d6ff"Ta5d6ff added to the file-name of the page. If your page is named Ta5d6ff"Ta5d6ffsecret_page.muTa5d6ff"Ta5d6ff, just add a file named Ta5d6ff"Ta5d6ffsecret_page.mu.allowedTa5d6ff"Ta5d6ff.

Ta5d6ffFor each user allowed to access the page, add a line to this file, containing the hash of that users primary identity. Users can find their own identity hash in the `![ Network ]`! part of the program, under `!Local Peer Info`!. If you want to allow access for three different users, your file would look like this:

Ta5d6ff`Faaa
Ta5d6ff`=
Ta5d6ff24c2dc2248953e0a3c21
Ta5d6ff564a476410f4fca2ae93
Ta5d6ff8bb864743f12f53395a1
Ta5d6ff`=
Ta5d6ff``

Ta5d6ffYou can also dynamically generate this list, by making the file executable, and writing a script (in whatever language you want), that prints the list to stdout. Every time someone tries to request the page, Nomad Network will check the allowed identities list, and only grant access to allowed users.

Ta5d6ffBy default, Nomad Network connects anonymously to all nodes. To be able to identify, and access restricted pages, you must allow identifying on a per-node basis. To allow identifying when connecting to a node, you must go to the `!Known Nodes`! list in the `![ Network ]`! part of the program, and enable the `!Identify When Connecting`! checkbox under `!Node Info`!.

Ta5d6ff>>Files

Ta5d6ffLike pages, you can place files you want to make available in the `!~/.nomadnetwork/storage/files`! directory. To let a peer download a file, you should create a link to it in one of your pages.

Ta5d6ff>>Links and URLs

Ta5d6ffLinks to pages and resources in Nomad Network use a simple URL format. Here is an example:

Ta5d6ff`!1385edace36466a6b3dd:/page/index.mu`!

Ta5d6ffThe first part is the 10 byte destination address of the node (represented as readable hexadecimal), followed by the `!:`! character. Everything after the `!:`! represents the request path.

Ta5d6ffBy convention, Nomad Network nodes maps all hosted pages under the `!/page`! path, and all hosted files under the `!/file`! path. You can create as many subdirectories for pages and files as you please, and they will be automatically mapped to corresponding request paths.

Ta5d6ffYou can omit the destination address of the node, if you are reffering to a local page or file. You must still keep the `!:`! character. In such a case, the URL to a page could look like this:

Ta5d6ff`!:/page/other_page.mu`!

Ta5d6ffThe URL to a local file could look like this:

Ta5d6ff`!:/file/document.pdf`!

Ta5d6ffLinks can be inserted into micron documents. See the `*Markup`* section of this guide for info on how to do so.

Ta5d6ff'''

Te6edf3TOPIC_CONVERSATIONS Tff7b72= Ta5d6ff'''Ta5d6ff>Conversations

Ta5d6ffConversations in Nomad Network
Ta5d6ff'''


Te6edf3TOPIC_FIRST_RUN Tff7b72= Ta5d6ff'''Ta5d6ff>First Time Information

Ta5d6ffHi there. This first run message will only appear once. It contains a few pointers on getting started with Nomad Network, and getting the most out of the program.

Ta5d6ffYouTa5d6ff'Ta5d6ffre currently located in the guide section of the program. ITa5d6ff'Ta5d6ffm sorry I had to drag you here by force, but it will only happen this one time, I promise. If you ever get lost, return here and peruse the list of topics you see on the left. I will do my best to fill it with answers to mostly anything about Nomad Network.

Ta5d6ffTo get the most out of Nomad Network, you will need a terminal that supports UTF-8 and at least 256 colors, ideally true-color. If your terminal supports true-color, you can go to the `![ Config ]`! menu item, launch the editor and change the configuration.

Ta5d6ffIt is recommended to use a terminal size of at least 122x32. Nomad Network will work with smaller terminal sizes, but the interface might feel a bit cramped.

Ta5d6ffIf you donTa5d6ff'Ta5d6fft already have a Nerd Font installed (see https://www.nerdfonts.com/), I also highly recommend to do so, since it will greatly expand the amount of glyphs, icons and graphics that Nomad Network can use. Once you have your terminal set up with a Nerd Font, go to the `![ Config ]`! menu item and enable Nerd Fonts in the configuration instead of normal unicode glyphs.

Ta5d6ffNomad Network expects that you are already connected to some form of Reticulum network. That could be as simple as the default one that Reticulum auto-generates on your local ethernet/WiFi network, or something much more complex. This short guide wonTa5d6ff'Ta5d6fft go into any details on building networks, but you will find other entries in the guide that deal with network setup and configuration.

Ta5d6ffAt least, if Nomad Network launches, it means that it is connected to a running Reticulum instance, that should in turn be connected to `*something`*, which should get you started.

Ta5d6ffFor more some more information, you can also read the `*Introduction`* section of this guide.

Ta5d6ffNow go out there and explore. This is still early days. See what you can find and create.

Ta5d6ff>>>>>>>>>>>>>>>
Ta5d6ff-Tffea00\u223f
Ta5d6ff<

Ta5d6ff'''

Te6edf3TOPIC_CONFIG Tff7b72= Ta5d6ff'''Ta5d6ff>Configuration Options

Ta5d6ffTo change the configuration of Nomad Network, you must edit the configuration file. By default, this is located at `!~/.nomadnetwork/config`! on your system. You can open it in any text-editor, and change the options. You can also use the editor built in to this program, under the `![ Config ]`! menu item. The default configuration file contains comments on all the different configuration options present, and explains their possible settings.

Ta5d6ffFor reference, all the configuration options are listed and explained here as well. The configuration is divided into different sections, each with their own options.

Ta5d6ff>> Logging Section

Ta5d6ffThis section hold configuration directives related to logging output, and is delimited by the `![logging]`! header in the configuration file. Available directives, along with their default values, are as follows:

Ta5d6ff>>>
Ta5d6ff`!loglevel = 4`!
Ta5d6ff>>>>
Ta5d6ffSets the verbosity of the log output. Must be an integer from 0 through 7.
Ta5d6ff>>>>>
Ta5d6ff0: Log only critical information
Ta5d6ff1: Log errors and lower log levels
Ta5d6ff2: Log warnings and lower log levels
Ta5d6ff3: Log notices and lower log levels
Ta5d6ff4: Log info and lower (this is the default)
Ta5d6ff5: Verbose logging
Ta5d6ff6: Debug logging
Ta5d6ff7: Extreme logging
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!destination = file`!
Ta5d6ff>>>>
Ta5d6ffDetermines the output destination of logged information. Must be `!file`! or `!console`!.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!logfile = ~/.nomadnetwork/logfile`!
Ta5d6ff>>>>
Ta5d6ffPath to the log file. Must be a writable filesystem path.
Ta5d6ff<

Ta5d6ff>> Client Section

Ta5d6ffThis section hold configuration directives related to the client behaviour and user interface of the program. It is delimited by the `![client]`! header in the configuration file. Available directives, along with their default values, are as follows:

Ta5d6ff>>>
Ta5d6ff`!enable_client = yes`!
Ta5d6ff>>>>
Ta5d6ffDetermines whether the client part of the program should be started on launch. Must be a boolean value.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!user_interface = text`!
Ta5d6ff>>>>
Ta5d6ffSelects which interface to use. Currently, only the `!text`! interface is available.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!downloads_path = ~/Downloads`!
Ta5d6ff>>>>
Ta5d6ffSets the filesystem path to store downloaded files in.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!announce_at_start = yes`!
Ta5d6ff>>>>
Ta5d6ffDetermines whether your LXMF address is automatically announced when the program starts. Must be a boolean value.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!try_propagation_on_send_fail = yes`!
Ta5d6ff>>>>
Ta5d6ffWhen this option is enabled, and sending a message directly to a peer fails, Nomad Network will instead deliver the message to the propagation network, for later retrieval by the recipient.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!periodic_lxmf_sync = yes`!
Ta5d6ff>>>>
Ta5d6ffWhether the program should periodically download messages from available propagation nodes in the background.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!lxmf_sync_interval = 360`!
Ta5d6ff>>>>
Ta5d6ffThe number of minutes between each automatic sync. The default is equal to 6 hours.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!lxmf_sync_limit = 8`!
Ta5d6ff>>>>
Ta5d6ffOn low-bandwidth networks, it can be useful to limit the amount of messages downloaded in each sync. The default is 8. Set to 0 to download all available messages every time a sync occurs.
Ta5d6ff<

Ta5d6ff>> Text UI Section

Ta5d6ffThis section hold configuration directives related to the look and feel of the text-based user interface of the program. It is delimited by the `![textui]`! header in the configuration file. Available directives, along with their default values, are as follows:

Ta5d6ff>>>
Ta5d6ff`!intro_time = 1`!
Ta5d6ff>>>>
Ta5d6ffNumber of seconds to display the intro screen. Set to 0 to disable the intro screen.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!intro_text = Nomad Network`!
Ta5d6ff>>>>
Ta5d6ffThe text to display on the intro screen.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!editor = editor`!
Ta5d6ff>>>>
Ta5d6ffWhat editor program to use when launching a text editor from within the program. Defaults to the `!editor`! alias, which in turn will use the default editor of the operating system.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!glyphs = unicode`!
Ta5d6ff>>>>
Ta5d6ffDetermines what set of glyphs the program uses for rendering the user interface.
Ta5d6ff>>>>>
Ta5d6ffThe `!plain`! set only uses ASCII characters, and should work on all terminals, but is rather boring.
Ta5d6ffThe `!unicode`! set uses more interesting glyphs and icons, and should work on most terminals. This is the default.
Ta5d6ffThe `!nerdfont`! set allows using a much wider range of glyphs, icons and graphics, and should be enabled if you are using a Nerd Font in your terminal.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!mouse_enabled = yes`!
Ta5d6ff>>>>
Ta5d6ffDetermines whether the program should react to mouse/touch input. Must be a boolean value.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!hide_guide = no`!
Ta5d6ff>>>>
Ta5d6ffThis option allows hiding the `![ Guide ]`! section of the program.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!animation_interval = 1`!
Ta5d6ff>>>>
Ta5d6ffSets the animation refresh rate for certain animations and graphics in the program. Must be an integer.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!colormode = 256`!
Ta5d6ff>>>>
Ta5d6ffTells the program what color palette is supported by the terminal. Most terminals support `!256`! colors. If your terminal supports full-color / RGB-mode, set to `!24bit`!. Available options:
Ta5d6ff>>>>>
Ta5d6ff`!monochrome`! Single-color (black/white) palette, for monochrome displays
Ta5d6ff`!16`! Low-color mode for really old-school terminals
Ta5d6ff`!88`! Standard palletised color-mode for terminals
Ta5d6ff`!256`! Almost all modern terminals support this mode
Ta5d6ff`!24bit`! Most new terminals support this full-color mode
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!theme = dark`!
Ta5d6ff>>>>
Ta5d6ffWhat color theme to use. Set it to match your terminal theme. Can be either `!dark`! or `!light`!.
Ta5d6ff<

Ta5d6ff>> Node Section

Ta5d6ffThis section holds configuration directives related to the node hosting. It is delimited by the `![node]`! header in the configuration file. Available directives, along with example values, are as follows:

Ta5d6ff>>>
Ta5d6ff`!enable_node = no`!
Ta5d6ff>>>>
Ta5d6ffDetermines whether the node server should be started on launch. Must be a boolean value, and is turned off by default.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!node_name = DisplayNameTa5d6ff'Ta5d6ffs Node`!
Ta5d6ff>>>>
Ta5d6ffDefines what the announced name of the node should be.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!announce_at_start = yes`!
Ta5d6ff>>>>
Ta5d6ffDetermines whether your node is automatically announced on the network when the program starts. Must be a boolean value.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!announce_interval = 360`!
Ta5d6ff>>>>
Ta5d6ffDetermines how often, in minutes, your node is announced on the network. Defaults to 6 hours.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!pages_path = ~/.nomadnetwork/storage/pages`!
Ta5d6ff>>>>
Ta5d6ffDetermines where the node server will look for hosted pages. Must be a readable filesystem path.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!files_path = ~/.nomadnetwork/storage/files`!
Ta5d6ff>>>>
Ta5d6ffDetermines where the node server will look for downloadable files. Must be a readable filesystem path.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!message_storage_limit = 2000`!
Ta5d6ff>>>>
Ta5d6ffConfigures the maximum amount of storage, in megabytes, that the LXMF Propagation Node will use to store messages.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!prioritise_destinations = 41d20c727598a3fbbdf9106133a3a0ed, d924b81822ca24e68e2effea99bcb8cf`!
Ta5d6ff>>>>
Ta5d6ffConfigures the LXMF Propagation Node to prioritise storing messages for certain destinations. If the message store reaches the specified limit, LXMF will prioritise keeping messages for destinations specified with this option. This setting is optional, and generally you do not need to use it.
Ta5d6ff<

Ta5d6ff>> Printing Section

Ta5d6ffThis section holds configuration directives related to printing. It is delimited by the `![printing]`! header in the configuration file. Available directives, along with example values, are as follows:

Ta5d6ff>>>
Ta5d6ff`!print_messages = no`!
Ta5d6ff>>>>
Ta5d6ffDetermines whether messages should be printed upon arrival. Must be a boolean value, and is turned off by default.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!message_template = ~/.nomadnetwork/print_template_msg.txt`!
Ta5d6ff>>>>
Ta5d6ffDetermines where the template for printed messages is found. Must be a filesystem path. If you set this path to a non-existing file, an example will be generated in the specified location.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!print_from = 76fe5751a56067d1e84eef3e88eab85b, trusted`!
Ta5d6ff>>>>
Ta5d6ffDetermines from which destinations messages are printed. Can be a list of destinations hashes, the keyword Ta5d6ff"Ta5d6fftrustedTa5d6ff"Ta5d6ff, or Ta5d6ff"Ta5d6ffeverywhereTa5d6ff"Ta5d6ff.
Ta5d6ff<

Ta5d6ff>>>
Ta5d6ff`!print_command = lp -d PRINTER_NAME -o cpi=16 -o lpi=8`!
Ta5d6ff>>>>
Ta5d6ffSpecifies the command that Nomad Network uses to print the message. Defaults to Ta5d6ff"Ta5d6fflpTa5d6ff"Ta5d6ff. The above example works well for small thermal-roll printers.
Ta5d6ff<

Ta5d6ff>Ignoring Destinations

Ta5d6ffIf you encounter peers or nodes on the network, that you would rather not see in your client, you can add them to the `!~/.nomadnetwork/ignored`! file. To ignore nodes or peers, add one 32-character hexadecimal destination hash per line to the file. To unignore one again, simply remove the corresponding entry from the file and restart Nomad Network.
Ta5d6ff'''

Te6edf3TOPIC_NETWORKS Tff7b72= Ta5d6ff'''Ta5d6ff>Network Configuration

Ta5d6ffNomad Network uses the Reticulum Network Stack for communication and encryption. This means that it will use any interfaces and communications channels already defined in your Reticulum configuration.

Ta5d6ffReticulum supports using many kinds of devices as networking interfaces, and allows you to mix and match them in any way you choose. The number of distinct network topologies you can create with Reticulum is more or less endless, but common to them all is that you will need to define one or more interfaces for Reticulum to use.

Ta5d6ffIf you have not changed the default Reticulum configuration, which should be located at `!~/.reticulum/config`!, you will have one interface active right now. With it, you should be able to communicate with any other peers and systems that exist on your local ethernet or WiFi network, if your computer is connected to one, and most probably nothing else outside of that.

Ta5d6ffTo learn how to configure your Reticulum setup to use LoRa radios, packet radio or other interfaces, or connect to other Reticulum networks via the Internet, the best places to start is to read the relevant parts of the Reticulum Manual, which can be found on GitHub:

Ta5d6ff`c`_https://markqvist.github.io/Reticulum/manual/interfaces.html`_
Ta5d6ff`l

Ta5d6ffIf you donTa5d6ff'Ta5d6fft currently have access to the Internet, you can generate a configuration file full of examples of all the supported interface types, by using the command `!rnsd --exampleconfig`!. Using those examples, it should be possible to get a working setup going.

Ta5d6ffFor future reference, you can download the Reticulum Manual in PDF format here:

Ta5d6ff`c`_https://github.com/markqvist/Reticulum/raw/master/docs/ReticulumTa5d6ff%Ta5d6ff20Manual.pdf`_
Ta5d6ff`l

Ta5d6ffIt might be nice to keep that handy when you are not connected to the Internet, as it is full of information and examples that are also very relevant to Nomad Network.

Ta5d6ff>The Unsigned.io Testnet

Ta5d6ffIf you have Internet access, and just want to get started experimenting, you are welcome to join the Unsigned.io RNS Testnet. The testnet is just that, an informal network for testing and experimenting. It will be up most of the time, and anyone can join, but it also means that thereTa5d6ff'Ta5d6ffs no guarantees for service availability.

Ta5d6ffThe Testnet also runs the latest version of Reticulum, often even a short while before it is publicly released, which means strange behaviour might occur. If none of that scares you, add the following interface to your Reticulum configuration file to join:

Ta5d6ff>>
Ta5d6ff[[RNS Testnet Frankfurt]]
Ta5d6ff type = TCPClientInterface
Ta5d6ff interface_enabled = yes
Ta5d6ff outgoing = True
Ta5d6ff target_host = frankfurt.rns.unsigned.io
Ta5d6ff target_port = 4965

Ta5d6ff'''

Te6edf3TOPIC_DISPLAYTEST Tff7b72= Ta5d6ff'''Ta5d6ff>Markup & Color Display Test


Ta5d6ff`cYou can use this section to gauge how well your terminal reproduces the various types of formatting used by Nomad Network.
Ta5d6ff``


Ta5d6ff>>>>>>>>>>>>>>>>>>>>
Ta5d6ff-Tffea00\u223f
Ta5d6ff<


Ta5d6ff>>
Ta5d6ff`a`!This line should be bold, and aligned to the left`!

Ta5d6ff`c`*This one should be italic and centered`*

Ta5d6ff`r`_And this one should be underlined, aligned right`_
Ta5d6ff``

Ta5d6ffThe following line should contain a red gradient bar:
Ta5d6ff`B100 `B200 `B300 `B400 `B500 `B600 `B700 `B800 `B900 `Ba00 `Bb00 `Bc00 `Bd00 `Be00 `Bf00`b

Ta5d6ffThe following line should contain a green gradient bar:
Ta5d6ff`B010 `B020 `B030 `B040 `B050 `B060 `B070 `B080 `B090 `B0a0 `B0b0 `B0c0 `B0d0 `B0e0 `B0f0`b

Ta5d6ffThe following line should contain a blue gradient bar:
Ta5d6ff`B001 `B002 `B003 `B004 `B005 `B006 `B007 `B008 `B009 `B00a `B00b `B00c `B00d `B00e `B00f`b

Ta5d6ffThe following line should contain a grayscale gradient bar:
Ta5d6ff`Bg06 `Bg13 `Bg20 `Bg26 `Bg33 `Bg40 `Bg46 `Bg53 `Bg59 `Bg66 `Bg73 `Bg79 `Bg86 `Bg92 `Bg99`b

Ta5d6ffUnicode Glyphs : Tffea00\u2713Ta5d6ff Tffea00\u2715Ta5d6ff Tffea00\u26a0Ta5d6ff Tffea00\u24c3Ta5d6ff Tffea00\u2193

Ta5d6ffNerd Font Glyphs : Tffea00\uf484Ta5d6ff Tffea00\uf9c4Ta5d6ff Tffea00\uf719Ta5d6ff Tffea00\uf502Ta5d6ff Tffea00\uf415Ta5d6ff Tffea00\uf023Ta5d6ff Tffea00\uf06e
Ta5d6ff'''


Te6edf3TOPIC_LICENSES Tff7b72= Ta5d6ff'''Ta5d6ff>Thanks, Acknowledgements and Licenses

Ta5d6ffThis program uses various other software components, without which Nomad Network would not have been possible. Sincere thanks to the authors and contributors of the following projects

Ta5d6ff>>>
Ta5d6ff - `!Cryptography.io`! by `*pyca`*
Ta5d6ff https://cryptography.io/
Ta5d6ff BSD License

Ta5d6ff - `!Urwid`! by `*Ian Ward`*
Ta5d6ff http://urwid.org/
Ta5d6ff LGPL-2.1 License

Ta5d6ff - `!Additional Urwid Widgets`! by `*AFoeee`*
Ta5d6ff https://github.com/AFoeee/additional_urwid_widgets
Ta5d6ff MIT License

Ta5d6ff - `!Scrollable`! by `*rndusr`*
Ta5d6ff https://github.com/rndusr/stig/blob/master/stig/tui/scroll.py
Ta5d6ff GPLv3 License

Ta5d6ff - `!Configobj`! by `*Michael Foord`*
Ta5d6ff https://github.com/DiffSK/configobj
Ta5d6ff BSD License

Ta5d6ff - `!Reticulum Network Stack`! by `*unsignedmark`*
Ta5d6ff https://github.com/markqvist/Reticulum
Ta5d6ff MIT License

Ta5d6ff - `!LXMF`! by `*unsignedmark`*
Ta5d6ff https://github.com/markqvist/LXMF
Ta5d6ff MIT License
Ta5d6ff'''


Te6edf3TOPIC_MARKUP Tff7b72= Ta5d6ff'''Ta5d6ff>Outputting Formatted Text


Ta5d6ff>>>>>>>>>>>>>>>
Ta5d6ff-Tffea00\u223f
Ta5d6ff<

Ta5d6ff`c`!Hello!`! This is output from `*micron`*
Ta5d6ffMicron generates formatted text for your terminal
Ta5d6ff`a

Ta5d6ff>>>>>>>>>>>>>>>
Ta5d6ff-Tffea00\u223f
Ta5d6ff<


Ta5d6ffNomad Network supports a simple and functional markup language called `*micron`*. If you are familiar with `*markdown`* or `*HTML`*, you will feel right at home writing pages with micron.

Ta5d6ffWith micron you can easily create structured documents and pages with formatting, colors, glyphs and icons, ideal for display in terminals.

Ta5d6ff>>Recommendations and Requirements

Ta5d6ffWhile micron can output formatted text to even the most basic terminal, thereTa5d6ff'Ta5d6ffs a few capabilities your terminal `*must`* support to display micron output correctly, and some that, while not strictly necessary, make the experience a lot better.

Ta5d6ffFormatting such as `_underline`_, `!bold`! or `*italics`* will be displayed if your terminal supports it.

Ta5d6ffIf you are having trouble getting micron output to display correctly, try using `*gnome-terminal`* or `*alacritty`*, which should work with all formatting options out of the box. Most other terminals will work fine as well, but you might have to change some settings to get certain formatting to display correctly.

Ta5d6ff>>>Encoding

Ta5d6ffAll micron sources are intepreted as UTF-8, and micron assumes it can output UTF-8 characters to the terminal. If your terminal does not support UTF-8, output will be faulty.

Ta5d6ff>>>Colors

Ta5d6ffShading and coloring text and backgrounds is integral to micron output, and while micron will attempt to gracefully degrade output even to 1-bit terminals, you will get the best output with terminals supporting at least 256 colors. True-color support is recommended.

Ta5d6ff>>>Terminal Font

Ta5d6ffWhile any unicode capable font can be used with micron, itTa5d6ff'Ta5d6ffs highly recommended to use a `*Ta5d6ff"Ta5d6ffNerd FontTa5d6ff"Ta5d6ff`* (see https://www.nerdfonts.com/), which will add a lot of extra glyphs and icons to your output.

Ta5d6ff> A Few Demo Outputs

Ta5d6ff`F222`Bddd

Ta5d6ff`cWith micron, you can control layout and presentation
Ta5d6ff`a

Ta5d6ff``

Ta5d6ff`B33f

Ta5d6ffYou can change background ...

Ta5d6ff``

Ta5d6ff`B393

Ta5d6ff`r`F320... and foreground colors`f
Ta5d6ff`a

Ta5d6ff`b

Ta5d6ffIf you want to make a break, horizontal dividers can be inserted. They can be plain, like the one below this text, or you can style them with unicode characters and glyphs, like the wavy divider in the beginning of this document.

Ta5d6ff-

Ta5d6ff`cText can be `_underlined`_, `!bold`! or `*italic`*.

Ta5d6ffYou can also `_`*`!`B5d5`F222combine`f`b`_ `_`Ff00f`Ff80o`Ffd0r`F9f0m`F0f2a`F0fdt`F07ft`F43fi`F70fn`Fe0fg`` for some fabulous effects.
Ta5d6ff`a


Ta5d6ff>>>Sections and Headings

Ta5d6ffYou can define an arbitrary number of sections and sub sections, each with their own named headings. Text inside sections will be automatically indented.

Ta5d6ff-

Ta5d6ffIf you place a divider inside a section, it will adhere to the section indents.

Ta5d6ff>>>>>
Ta5d6ffIf no heading text is defined, the section will appear as a sub-section without a header. This can be useful for creating indented blocks of text, like this one.

Ta5d6ff>Micron tags

Ta5d6ffTags are used to format text with micron. Some tags can appear anywhere in text, and some must appear at the beginning of a line. If you need to write text that contains a sequence that would be interpreted as a tag, you can escape it with the character Tffea00\\Ta5d6ff.

Ta5d6ffIn the following sections, the different tags will be introduced. Any styling set within micron can be reset to the default style by using the special Tffea00\\Ta5d6ff`Tffea00\\Ta5d6ff` tag anywhere in the markup, which will immediately remove any formatting previously specified.

Ta5d6ff>>Alignment

Ta5d6ffTo control text alignment use the tag Tffea00\\Ta5d6ff`c to center text, Tffea00\\Ta5d6ff`l to left-align, Tffea00\\Ta5d6ff`r to right-align, and Tffea00\\Ta5d6ff`a to return to the default alignment of the document. Alignment tags must appear at the beginning of a line. Here is an example:

Ta5d6ff`Faaa
Ta5d6ff`=
Ta5d6ff`cThis line will be centered.
Ta5d6ffSo will this.
Ta5d6ff`aThe alignment has now been returned to default.
Ta5d6ff`rThis will be aligned to the right
Ta5d6ff``
Ta5d6ff`=
Ta5d6ff``

Ta5d6ffThe above markup produces the following output:

Ta5d6ff`Faaa`B333

Ta5d6ff`cThis line will be centered.
Ta5d6ffSo will this.

Ta5d6ff`aThe alignment has now been returned to default.

Ta5d6ff`rThis will be aligned to the right

Ta5d6ff``


Ta5d6ff>>Formatting

Ta5d6ffText can be formatted as `!bold`! by using the Tffea00\\Ta5d6ff`! tag, `_underline`_ by using the Tffea00\\Ta5d6ff`_ tag and `*italic`* by using the Tffea00\\Ta5d6ff`* tag.

Ta5d6ffHereTa5d6ff'Ta5d6ffs an example of formatting text:

Ta5d6ff`Faaa
Ta5d6ff`=
Ta5d6ffWe shall soon see `!bold`! paragraphs of text decorated with `_underlines`_ and `*italics`*. Some even dare `!`*`_combine`` them!
Ta5d6ff`=
Ta5d6ff``

Ta5d6ffThe above markup produces the following output:

Ta5d6ff`Faaa`B333

Ta5d6ffWe shall soon see `!bold`! paragraphs of text decorated with `_underlines`_ and `*italics`*. Some even dare `!`*`_combine`!`*`_ them!

Ta5d6ff``


Ta5d6ff>>Sections

Ta5d6ffTo create sections and subsections, use the > tag. This tag must be placed at the beginning of a line. To specify a sub-section of any level, use any number of > tags. If text is placed after a > tag, it will be used as a heading.

Ta5d6ffHere is an example of sections:

Ta5d6ff`Faaa
Ta5d6ff`=
Ta5d6ff>High Level Stuff
Ta5d6ffThis is a section. It contains this text.

Ta5d6ff>>Another Level
Ta5d6ffThis is a sub section.

Ta5d6ff>>>Going deeper
Ta5d6ffA sub sub section. We could continue, but you get the point.

Ta5d6ff>>>>
Ta5d6ffWait! ItTa5d6ff'Ta5d6ffs worth noting that we can also create sections without headings. They look like this.
Ta5d6ff`=
Ta5d6ff``

Ta5d6ffThe above markup produces the following output:

Ta5d6ff`Faaa`B333
Ta5d6ff>High Level Stuff
Ta5d6ffThis is a section. It contains this text.

Ta5d6ff>>Another Level
Ta5d6ffThis is a sub section.

Ta5d6ff>>>Going deeper
Ta5d6ffA sub sub section. We could continue, but you get the point.

Ta5d6ff>>>>
Ta5d6ffWait! ItTa5d6ff'Ta5d6ffs worth noting that we can also create sections without headings. They look like this.
Ta5d6ff``


Ta5d6ff>Colors

Ta5d6ffForeground colors can be specified with the Tffea00\\Ta5d6ff`F tag, followed by three hexadecimal characters. To return to the default foreground color, use the Tffea00\\Ta5d6ff`f tag. Background color is specified in the same way, but by using the Tffea00\\Ta5d6ff`B and Tffea00\\Ta5d6ff`b tags.

Ta5d6ffHereTa5d6ff'Ta5d6ffs a few examples:

Ta5d6ff`Faaa
Ta5d6ff`=
Ta5d6ffYou can use `B5d5`F222 color `f`b `Ff00f`Ff80o`Ffd0r`F9f0m`F0f2a`F0fdt`F07ft`F43fi`F70fn`Fe0fg`f for some fabulous effects.
Ta5d6ff`=
Ta5d6ff``

Ta5d6ffThe above markup produces the following output:

Ta5d6ff`Faaa`B333

Ta5d6ffYou can use `B5d5`F222 color `f`B333 `Ff00f`Ff80o`Ffd0r`F9f0m`F0f2a`F0fdt`F07ft`F43fi`F70fn`Fe0fg`f for some fabulous effects.

Ta5d6ff``


Ta5d6ff>Links

Ta5d6ffLinks to pages, files or other resources can be created with the Tffea00\\Ta5d6ff`[ tag, which should always be terminated with a closing ]. You can create links with and without labels, it is up to you to control the formatting of links with other tags. Although not strictly necessary, it is good practice to at least format links with underlining.

Ta5d6ffHereTa5d6ff'Ta5d6ffs a few examples:

Ta5d6ff`Faaa
Ta5d6ff`=
Ta5d6ffHere is a link without any label: `[72914442a3689add83a09a767963f57c:/page/index.mu]

Ta5d6ffThis is a `[labeled link`72914442a3689add83a09a767963f57c:/page/index.mu] to the same page, but itTa5d6ff'Ta5d6ffs hard to see if you donTa5d6ff'Ta5d6fft know it

Ta5d6ffHere is `F00a`_`[a more visible link`72914442a3689add83a09a767963f57c:/page/index.mu]`_`f
Ta5d6ff`=
Ta5d6ff``

Ta5d6ffThe above markup produces the following output:

Ta5d6ff`Faaa`B333

Ta5d6ffHere is a link without any label: `[72914442a3689add83a09a767963f57c:/page/index.mu]

Ta5d6ffThis is a `[labeled link`72914442a3689add83a09a767963f57c:/page/index.mu] to the same page, but itTa5d6ff'Ta5d6ffs hard to see if you donTa5d6ff'Ta5d6fft know it

Ta5d6ffHere is `F00f`_`[a more visible link`72914442a3689add83a09a767963f57c:/page/index.mu]`_`f

Ta5d6ff``

Ta5d6ffWhen links like these are displayed in the built-in browser, clicking on them or activating them using the keyboard will cause the browser to load the specified URL.

Ta5d6ff>Comments

Ta5d6ffYou can insert comments that will not be displayed in the output by starting a line with the # character.

Ta5d6ffHereTa5d6ff'Ta5d6ffs an example:

Ta5d6ff`Faaa
Ta5d6ff`=
Ta5d6ff# This line will not be displayed
Ta5d6ffThis line will
Ta5d6ff`=
Ta5d6ff``

Ta5d6ffThe above markup produces the following output:

Ta5d6ff`Faaa`B333

Ta5d6ff# This line will not be displayed
Ta5d6ffThis line will

Ta5d6ff``


Ta5d6ff>Literals

Ta5d6ffTo display literal content, for example source-code, or blocks of text that should not be interpreted by micron, you can use literal blocks, specified by the Tffea00\\Ta5d6ff`= tag. Below is the source code of this entire document, presented as a literal block.

Ta5d6ff-

Ta5d6ff`=
Ta5d6ff'''
Te6edf3TOPIC_MARKUP Tff7b72+Tff7b72= Te6edf3TOPIC_MARKUPTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff`=Ta5d6ff"Tb4b4b4, Ta5d6ff"Tffea00\\Ta5d6ff`=Ta5d6ff"Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff[ micron source for document goes here, we donTa5d6ff'Ta5d6fft want infinite recursion now, do we? ]Tffea00\nTffea00\\Ta5d6ff`=Ta5d6ff"
Te6edf3TOPIC_MARKUP Tff7b72+Tff7b72= Ta5d6ff"Tffea00\nTa5d6ff`=Tffea00\nTffea00\nTa5d6ff>Closing RemarksTffea00\nTffea00\nTa5d6ffIf you made it all the way here, you should be well equipped to write documents and pages using micron. Thank you for staying with me.Tffea00\nTffea00\nTa5d6ff`cTffea00\U0001F332Tffea00\nTa5d6ff"


Te6edf3TOPICS Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffIntroductionTa5d6ff"Tb4b4b4: Te6edf3TOPIC_INTRODUCTIONTb4b4b4,
Ta5d6ff"Ta5d6ffConcepts & TerminologyTa5d6ff"Tb4b4b4: Te6edf3TOPIC_CONCEPTSTb4b4b4,
Ta5d6ff"Ta5d6ffConversationsTa5d6ff"Tb4b4b4: Te6edf3TOPIC_CONVERSATIONSTb4b4b4,
Ta5d6ff"Ta5d6ffHosting a NodeTa5d6ff"Tb4b4b4: Te6edf3TOPIC_HOSTINGTb4b4b4,
Ta5d6ff"Ta5d6ffConfiguration OptionsTa5d6ff"Tb4b4b4: Te6edf3TOPIC_CONFIGTb4b4b4,
Ta5d6ff"Ta5d6ffKeyboard ShortcutsTa5d6ff"Tb4b4b4: Te6edf3TOPIC_SHORTCUTSTb4b4b4,
Ta5d6ff"Ta5d6ffMarkupTa5d6ff"Tb4b4b4: Te6edf3TOPIC_MARKUPTb4b4b4,
Ta5d6ff"Ta5d6ffDisplay TestTa5d6ff"Tb4b4b4: Te6edf3TOPIC_DISPLAYTESTTb4b4b4,
Ta5d6ff"Ta5d6ffNetwork ConfigurationTa5d6ff"Tb4b4b4: Te6edf3TOPIC_NETWORKSTb4b4b4,
Ta5d6ff"Ta5d6ffCredits & LicensesTa5d6ff"Tb4b4b4: Te6edf3TOPIC_LICENSESTb4b4b4,
Ta5d6ff"Ta5d6ffFirst RunTa5d6ff"Tb4b4b4: Te6edf3TOPIC_FIRST_RUNTb4b4b4,
Tb4b4b4}


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────